package ar.frba.utn.diseñosistemas.Tests.TP3;


import java.util.ArrayList;
import java.util.Hashtable;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import ar.frba.utn.diseñosistemas.TP2.*;

public class TestBusquedas 
{
	IBuscador buscadorNormal;
	IBuscador buscadorConFiltroPorPrecio;
	IBuscador buscadorConFiltroPorReservados;
	IBuscador buscadorConFiltroPorClases;
	IBuscador buscadorOrdenadoPorPrecioAsc;
	IBuscador buscadorOrdenadoPorPrecioDesc;
	IBuscador buscadorOrdenadoPorTiempoVuelo;
	IBuscador buscadorOrdenadoPorPopularidad;
	
	Busqueda busquedaNormal;
	Busqueda busquedaConPrecios;
	Busqueda busquedaConVariasClases;
	Busqueda busquedaConUbicacionPasillo;
	Busqueda busquedaConReservados;
	Busqueda busquedaSinReservados;
	
	int recargo = 0;
	
	@Before
	public void setUp() throws Exception 
	{
		busquedaNormal = new Busqueda("EZE", "PER", "20/10/2012", null, null, null, null, true, null, 0);
		busquedaConPrecios = new Busqueda("BS", "LA", "20/10/2012", null, null, 6000, 10000, null, null, 0);
		busquedaConVariasClases = new Busqueda("PER", "USA", "20/10/2012", new Clase[] { Clase.Turista, Clase.Ejecutivo }, null, null, null, null, null, 0);
		busquedaConReservados = new Busqueda("EZE", "PER", "20/10/2012", null, null, null, null, false, null, 0);
		busquedaSinReservados = new Busqueda("EZE", "PER", "20/10/2012", null, null, null, null, true, null, 0);
		
		ArrayList<Aerolinea> mocks = new ArrayList<Aerolinea>();
		mocks.add(new AerolineaMock());
		AterrizarSingleton.getInstance().setAerolineas(mocks);
		
		Hashtable<String, Integer> popularidad = new Hashtable<String, Integer>();
		popularidad.put("EA342", 3);
		popularidad.put("EA341", 4);
		popularidad.put("EA343", 2);
		popularidad.put("EA345", 5);
		popularidad.put("EA344", 8);
		popularidad.put("EA346", 7);
		popularidad.put("EA347", 20);
		               
		AterrizarSingleton.getInstance().setPopularidad(popularidad); 
		
		buscadorNormal = new BuscadorBuilder()
						  	 .Construir();
		
		buscadorConFiltroPorPrecio = new BuscadorBuilder()
									    .conFiltroPorPrecio()
									    .Construir();
		
		buscadorConFiltroPorReservados = new BuscadorBuilder()
											.conFiltroPorReservado()
											.Construir();
		
		buscadorConFiltroPorClases = new BuscadorBuilder()
											.conFiltroPorClase()
											.Construir();
		
		buscadorOrdenadoPorPrecioAsc = new BuscadorBuilder()
											.ordenar(new PorPrecioAscendente())
											.Construir();
		
		buscadorOrdenadoPorPrecioDesc = new BuscadorBuilder()
											.ordenar(new PorPrecioDescendente())
											.Construir();
		
		buscadorOrdenadoPorTiempoVuelo = new BuscadorBuilder()
											.ordenar(new PorTiempoDeVuelo())
											.Construir(); 
		
		buscadorOrdenadoPorPopularidad = new BuscadorBuilder()
											.ordenar(new PorPopularidad())
											.Construir(); 
		
	}

	@Test
	public void buscarAsientosConFiltroDePrecio()
	{
		ArrayList<Itinerario> resultados = buscadorConFiltroPorPrecio.Buscar(busquedaConPrecios);
		
		for (Itinerario itinerario : resultados) 
		{
			Assert.assertTrue(itinerario.getPrecio() >= busquedaConPrecios.getPrecioMinimo()
						  &&  itinerario.getPrecio() <= busquedaConPrecios.getPrecioMaximo());
		}
	}

	@Test	
	public void buscarAsientosNoReservados()
	{
		ArrayList<Itinerario> resultados = buscadorConFiltroPorReservados.Buscar(busquedaSinReservados);
		
		for (Itinerario itinerario : resultados) 
		{
			Assert.assertFalse(itinerario.tieneAlgunaReserva());
		}
	}

	@Test
	public void buscarAsientosDeVariasClases()
	{
		ArrayList<Itinerario> resultados = buscadorConFiltroPorClases.Buscar(busquedaConVariasClases);
		
		for (Itinerario itinerario : resultados) 
		{
			for (Asiento asiento : itinerario.getAsientos()) 
			{
				Assert.assertTrue(asiento.getClase() == Clase.Turista || asiento.getClase() == Clase.Ejecutivo);
			}
		}
		
	}

	@Test
	public void buscarAsientosOrdenadosPorPrecioAscendente()
	{
		ArrayList<Itinerario> resultados = buscadorOrdenadoPorPrecioAsc.Buscar(busquedaNormal);
		Itinerario primer = resultados.get(0);
		
		for (Itinerario itinerario : resultados) 
		{
			Assert.assertTrue(primer.getPrecio() <= itinerario.getPrecio());
		}
	}
	
	@Test
	public void buscarAsientosOrdenadosPorPrecioDescendente()
	{
		ArrayList<Itinerario> resultados = buscadorOrdenadoPorPrecioDesc.Buscar(busquedaNormal);
		Itinerario primer = resultados.get(0);
		
		for (Itinerario itinerario : resultados) 
		{
			Assert.assertTrue(primer.getPrecio() >= itinerario.getPrecio());
		}
	}
	
	@Test
	public void buscarAsientosOrdenadosPorTiempoVueloAscendente()
	{
		ArrayList<Itinerario> resultados = buscadorOrdenadoPorTiempoVuelo.Buscar(busquedaNormal);
		Itinerario primer = resultados.get(0);
		
		for (Itinerario itinerario : resultados) 
		{
			Assert.assertTrue(primer.getTiempoDeVuelo() <= itinerario.getTiempoDeVuelo());
		}
	}
	
	@Test
	public void buscarAsientosOrdenadosPorPopularidadDescendente()
	{
		ArrayList<Itinerario> resultados = buscadorOrdenadoPorPopularidad.Buscar(busquedaNormal);
		Itinerario primer = resultados.get(0);
		
		for (Itinerario itinerario : resultados) 
		{
			Assert.assertTrue(primer.getPopularidad() >= itinerario.getPopularidad());
		}
	}
}
